gsk: Add GskRenderNodeClass.finalize()
authorBenjamin Otte <otte@redhat.com>
Sun, 11 Dec 2016 03:18:25 +0000 (04:18 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 20 Dec 2016 17:01:09 +0000 (18:01 +0100)
gsk/gskrendernode.c
gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h

index 6ac783624a51782d5b899f745393e9e624381bfa..310482cf9e19ad200d1f43405751ace025e55dda 100644 (file)
@@ -74,8 +74,8 @@ gsk_render_node_finalize (GskRenderNode *self)
 {
   self->is_mutable = TRUE;
 
-  g_clear_pointer (&self->surface, cairo_surface_destroy);
-  g_clear_pointer (&self->texture, gsk_texture_unref);
+  self->node_class->finalize (self);
+
   g_clear_pointer (&self->name, g_free);
 
   while (self->first_child)
index 920afaf94908d7b4013de3741ab321de19a3e8b4..0623c50d91a6dff2b4f341fae8d5b8cfec4c70cc 100644 (file)
 
 /*** GSK_TEXTURE_NODE ***/
 
+static void
+gsk_texture_node_finalize (GskRenderNode *node)
+{
+  gsk_texture_unref (node->texture);
+}
+
 static const GskRenderNodeClass GSK_TEXTURE_NODE_CLASS = {
   GSK_TEXTURE_NODE,
-  "GskTextureNode"
+  "GskTextureNode",
+  gsk_texture_node_finalize
 };
 
 GskTexture *
@@ -68,9 +75,17 @@ gsk_texture_node_new (GskTexture            *texture,
 
 /*** GSK_CAIRO_NODE ***/
 
+static void
+gsk_cairo_node_finalize (GskRenderNode *node)
+{
+  if (node->surface)
+    cairo_surface_destroy (node->surface);
+}
+
 static const GskRenderNodeClass GSK_CAIRO_NODE_CLASS = {
   GSK_CAIRO_NODE,
-  "GskCairoNode"
+  "GskCairoNode",
+  gsk_cairo_node_finalize
 };
 
 /*< private >
@@ -203,9 +218,15 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
 
 /**** GSK_CONTAINER_NODE ***/
 
+static void
+gsk_container_node_finalize (GskRenderNode *node)
+{
+}
+
 static const GskRenderNodeClass GSK_CONTAINER_NODE_CLASS = {
   GSK_CONTAINER_NODE,
-  "GskContainerNode"
+  "GskContainerNode",
+  gsk_container_node_finalize
 };
 
 /**
index 3908f9488038ca012278b3ff62e708cb8b3b05fc..2c969d1e174742cc5c769a761e8bb52b8f7248ac 100644 (file)
@@ -67,6 +67,7 @@ struct _GskRenderNodeClass
 {
   GskRenderNodeType node_type;
   const char *type_name;
+  void (* finalize) (GskRenderNode *node);
 };
 
 GskRenderNode *gsk_render_node_new (const GskRenderNodeClass *node_class);